package com.duoduo.深度广度优先;

import com.duoduo.TreeNode;

import java.util.LinkedList;
import java.util.Queue;

/**
 * @program: algorithm
 * @description: 翻转二叉树226
 * 给你一棵二叉树的根节点 root ，翻转这棵二叉树，并返回其根节点。
 * @author: chaidl  ！
 * @create: 2022-03-02 14:02
 */
public class 翻转二叉树 {
    public TreeNode invertTree4(TreeNode root) {
        if (root == null) {
            return null;
        }
        TreeNode left = invertTree(root.left);
        TreeNode right = invertTree(root.right);
        root.left = right;
        root.right = left;
        return root;
    }

    public TreeNode invertTree1(TreeNode root) {
        //递归函数的终止条件，节点为空时返回
        if(root==null) {
            return null;
        }
        //下面三句是将当前节点的左右子树交换
        TreeNode tmp = root.right;
        root.right = root.left;
        root.left = tmp;
        //递归交换当前节点的 左子树
        invertTree(root.left);
        //递归交换当前节点的 右子树
        invertTree(root.right);
        //函数返回时就表示当前这个节点，以及它的左右子树
        //都已经交换完了
        return root;
    }
    public TreeNode invertTree3(TreeNode root) {
        if(root==null) {
            return null;
        }
        //将二叉树中的节点逐层放入队列中，再迭代处理队列中的元素
        Queue<TreeNode> queue = new LinkedList<TreeNode>();
        queue.add(root);
        while(!queue.isEmpty()) {
            //每次都从队列中拿一个节点，并交换这个节点的左右子树
            TreeNode tmp = queue.poll();
            TreeNode left = tmp.left;
            tmp.left = tmp.right;
            tmp.right = left;
            //如果当前节点的左子树不为空，则放入队列等待后续处理
            if(tmp.left!=null) {
                queue.add(tmp.left);
            }
            //如果当前节点的右子树不为空，则放入队列等待后续处理
            if(tmp.right!=null) {
                queue.add(tmp.right);
            }
            
        }
        //返回处理完的根节点
        return root;
    }
  
    public TreeNode invertTree(TreeNode root) {
        //其实这个题和树的镜像是一个题
        // 我们先考虑什么时候会跳出递归,那就是root等于null的时候,然后把它上一个节点左右交换
        if (root==null){
            return null;
        }
        //先拿出来左子树作为临时变量
        TreeNode tmp = root.left;
        //左右交换
        root.left=invertTree(root.right);
        root.right=invertTree(tmp);
        return root;

    }
}
